package com.truntao.generator.domain.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.truntao.generator.domain.po.GenTableColumn;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotBlank;
import java.util.Date;
import java.util.Objects;

/**
 * 代码生成业务字段表 gen_table_column
 *
 * @author truntao
 */
@Data
public class GenTableColumnDTO {

    public GenTableColumnDTO() {
    }

    public GenTableColumnDTO(GenTableColumn genTableColumn) {
        if (Objects.nonNull(genTableColumn)) {
            setColumnId(genTableColumn.getColumnId());
            setTableId(genTableColumn.getTableId());
            setColumnName(genTableColumn.getColumnName());
            setColumnComment(genTableColumn.getColumnComment());
            setColumnType(genTableColumn.getColumnType());
            setJavaType(genTableColumn.getJavaType());
            setJavaField(genTableColumn.getJavaField());
            setPk(genTableColumn.getPk());
            setIncrement(genTableColumn.getIncrement());
            setRequired(genTableColumn.getRequired());
            setInsert(genTableColumn.getInsert());
            setEdit(genTableColumn.getEdit());
            setList(genTableColumn.getList());
            setQuery(genTableColumn.getQuery());
            setQueryType(genTableColumn.getQueryType());
            setHtmlType(genTableColumn.getHtmlType());
            setDictType(genTableColumn.getDictType());
            setSort(genTableColumn.getSort());
            setCreateBy(genTableColumn.getCreateBy());
            setCreateTime(genTableColumn.getCreateTime());
            setUpdateBy(genTableColumn.getUpdateBy());
            setUpdateTime(genTableColumn.getUpdateTime());
        }
    }

    /**
     * 编号
     */
    private Long columnId;

    /**
     * 归属表编号
     */
    private Long tableId;

    /**
     * 列名称
     */
    private String columnName;

    /**
     * 列描述
     */
    private String columnComment;

    /**
     * 列类型
     */
    private String columnType;

    /**
     * JAVA类型
     */
    private String javaType;

    /**
     * JAVA字段名
     */
    @NotBlank(message = "Java属性不能为空")
    private String javaField;

    /**
     * 是否主键（1是）
     */
    private String pk;

    /**
     * 是否自增（1是）
     */
    private String increment;

    /**
     * 是否必填（1是）
     */
    private String required;

    /**
     * 是否为插入字段（1是）
     */
    private String insert;

    /**
     * 是否编辑字段（1是）
     */
    private String edit;

    /**
     * 是否列表字段（1是）
     */
    private String list;

    /**
     * 是否查询字段（1是）
     */
    private String query;

    /**
     * 查询方式（EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围）
     */
    private String queryType;

    /**
     * 显示类型（input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件）
     */
    private String htmlType;

    /**
     * 字典类型
     */
    private String dictType;

    /**
     * 排序
     */
    private Integer sort;

    private String createBy;
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 更新者
     */
    private String updateBy;
    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    public boolean isPk() {
        return isPk(this.pk);
    }

    public boolean isPk(String isPk) {
        return isPk != null && StringUtils.equals("1", isPk);
    }

    public boolean isIncrement() {
        return isIncrement(this.increment);
    }

    public boolean isIncrement(String isIncrement) {
        return isIncrement != null && StringUtils.equals("1", isIncrement);
    }

    public boolean isRequired() {
        return isRequired(this.required);
    }

    public boolean isRequired(String isRequired) {
        return isRequired != null && StringUtils.equals("1", isRequired);
    }

    public boolean isInsert() {
        return isInsert(this.insert);
    }

    public boolean isInsert(String isInsert) {
        return isInsert != null && StringUtils.equals("1", isInsert);
    }

    public boolean isEdit() {
        return isInsert(this.edit);
    }

    public boolean isEdit(String isEdit) {
        return isEdit != null && StringUtils.equals("1", isEdit);
    }

    public boolean isList() {
        return isList(this.list);
    }

    public boolean isList(String isList) {
        return isList != null && StringUtils.equals("1", isList);
    }

    public String getCapJavaField() {
        return StringUtils.capitalize(this.javaField);
    }

    public boolean isSuperColumn() {
        return isSuperColumn(this.javaField);
    }

    public static boolean isSuperColumn(String javaField) {
        return StringUtils.equalsAnyIgnoreCase(javaField,
                // BaseEntity
                "createBy", "createTime", "updateBy", "updateTime", "remark",
                // TreeEntity
                "parentName", "parentId", "orderNum", "ancestors");
    }

    public boolean isUsableColumn() {
        return isUsableColumn(javaField);
    }

    public static boolean isUsableColumn(String javaField) {
        // isSuperColumn()中的名单用于避免生成多余Domain属性，若某些属性在生成页面时需要用到不能忽略，则放在此处白名单
        return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark");
    }

    public String readConverterExp() {
        String remarks = StringUtils.substringBetween(this.columnComment, "（", "）");
        StringBuffer sb = new StringBuffer();
        if (StringUtils.isNotEmpty(remarks)) {
            for (String value : remarks.split(" ")) {
                if (StringUtils.isNotEmpty(value)) {
                    Object startStr = value.subSequence(0, 1);
                    String endStr = value.substring(1);
                    sb.append("").append(startStr).append("=").append(endStr).append(",");
                }
            }
            return sb.deleteCharAt(sb.length() - 1).toString();
        } else {
            return this.columnComment;
        }
    }
}
